﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace TP2.Lib
{
    // [XmlInclude(typeof(Laser))]
     [Serializable]
    public class Laser : Proyectil
    {
        const int DANIO_LASER = 25,
                  VIDA_LASER = 1,
                  RADIO_LASER = 0,
                  RAPIDEZ_LASER = 5,
                  MAXIMO_DANIO_LASER = 100,
                  MINIMO_DANIO_LASER = 25;

        #region /*---------------Propiedades-------------------*/

        int _maximoDanio;
        public int MaximoDanio 
        {
            get {return this._maximoDanio ;}
            set { this._maximoDanio = value;} 
        }

        int _minimoDanio;
        public int MinimoDanio 
        {
            get { return this._minimoDanio; }
            set { this._minimoDanio = value; }
        }

        #endregion

        private Laser() { } /*Contructor vacio, lo utiliza la serialización*/
        
        public Laser(double[] inicio, double[] final, int[] dimensiones) : base(inicio, dimensiones)
        {
            this.Danio = DANIO_LASER;
            this.Vida = VIDA_LASER;
            this.Radio = RADIO_LASER;
            this.Rapidez = RAPIDEZ_LASER;
            this.MaximoDanio = MAXIMO_DANIO_LASER;
            this.MinimoDanio = MINIMO_DANIO_LASER;
            this.VengoDeEnemigo = false;
            this.Recorrido = new MovimientoLineal(inicio, final, this.Rapidez);
        }

        public void ModificarDanio(int valor)
        {
            int danio;
            danio = this.Danio + valor;
            if (danio > this.MaximoDanio) { danio = this.MaximoDanio; }
            if (danio < this.MinimoDanio) { danio = this.MinimoDanio; }
            this.Danio = danio;
        }

        public override Proyectil Actuar()
        {
            if ((this.Posicion[0] >= this.Dimensiones[0]) | (this.Posicion[0] <= 0) | (this.Posicion[1] >= this.Dimensiones[1]) | (this.Posicion[1] <= 0))
            {
                //Llegue a un borde
                this.ImpactoConBorde();
            }
            else
            {
                //Se mueve
                this.Mover();
            }
            return null;
        }

        private void Mover()
        {
            double[] posicion = new double[3];
            posicion = this.Recorrido.GetSiguientePunto(this.Posicion);
            this.Posicion = posicion;
        }
    }
}
